home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / xobbs.arc / xofiles.c < prev    next >
C/C++ Source or Header  |  1989-05-03  |  4KB  |  179 lines

  1. /* XOFILES.C File handling routines for XOBBS. Jim Durham, W2XO 10-24-88 */
  2. /* Version 1.0 */
  3. /* Code released to the amateur radio community */
  4.  
  5. #include "xobbs.h"        
  6.  
  7. /*PUTREC places a record in the file at location RECNUM. Location is determined
  8.     by multiplying the record size by the record number*/
  9.  
  10.  
  11. putrec(fd,recnum,rec,size)    /*put a record in the file at the given pos*/
  12.     int fd,recnum;        /*agrs file descrip,rec number and pointer to*/
  13.                 /*record*/
  14.     char *rec;
  15.     int size;
  16. {
  17.  
  18.     long offst;
  19.  
  20.  
  21.     offst=(long)recnum*(long)size;
  22.     lseek(fd,offst,0);
  23.     return(write(fd,rec,size));
  24. }
  25.  
  26. /*GETREC gets a record from the file. It operation may be inferred by
  27.     studying PUTREC. GETREC reads the record into the address given
  28.     by the third argument, pointer REC*/
  29.  
  30. getrec(fd,recnum,rec,size)        /*get a record from the file described by*/
  31.     int fd,recnum;        /*fp and return error code*/
  32.     char *rec;
  33.     int size;
  34. {
  35.     long offst;
  36.  
  37.     offst=(long)recnum*(long)size;
  38.     lseek(fd,offst,0);
  39.     return(read(fd, rec, size));
  40. }
  41.  
  42.  
  43. upload(filnam)
  44.         char *filnam;
  45. {
  46.     int fd,n,finish,i;
  47.  
  48.     static char ch = '\n';    
  49.     if((fd=open(lowcase(filnam),O_WRONLY|O_CREAT,0x1b6)) < 0)
  50.     {
  51.         sprintf(prinbuf,"Mailbox Cant Open %s\n",filnam);
  52.         prinout(NOFLUSH);
  53.         return(0);
  54.     }
  55.  
  56.     sprintf(prinbuf,"Send the File %s , end upload with control-Z\n",filnam);
  57.     prinout(FLUSH);
  58.     
  59.     for(;;){
  60.         getline(1);
  61.     n = strlen(inline);
  62.     finish = 0;
  63.     for(i=0;i < n; i++){
  64.         if(inline[i] == 26){
  65.             inline[i] = '\0';
  66.             n = strlen(inline);
  67.             finish = 1;
  68.             break;
  69.         }
  70.     }
  71.         if(inline[0] == '/')     /* or, check for /EX */
  72.             if((inline[1] == 'E' || inline[1] == 'e')
  73.               && (inline[2] == 'X' || inline[2] == 'x'))
  74.                 finish = 1;
  75.  
  76.         write(fd,inline,strlen(inline));
  77.         write(fd,&ch,1);
  78.         if(finish) break;    /* ^Z or /EX was sent */
  79.     }
  80.     close(fd);
  81.     return(1);
  82. }
  83.     
  84.  
  85. download(filnam)
  86.     char *filnam;
  87. {
  88.     int fd,bufcnt;
  89.     char c, *cp;
  90.  
  91.     if((fd=open(lowcase(filnam),O_RDONLY)) < 1)
  92.     {
  93.         sprintf(prinbuf,"Can't locate %s\n",filnam);
  94.     prinout(NOFLUSH);
  95.         return(0);
  96.     }        
  97.     bufcnt = 0;
  98.     cp=prinbuf;
  99.     while(c=xogetc(fd)){
  100.         if(c != '\n'){
  101.             *cp++ = c;
  102.             bufcnt++;
  103.             if(bufcnt > 254){    /*insert a newline if the user doesn't*/
  104.                 *cp++ = '\n';
  105.                 *cp = '\0';
  106.                 prinout(NOFLUSH);
  107.                 bufcnt = 0;
  108.                 cp = prinbuf;
  109.             }
  110.         }
  111.         else{
  112.             *cp++ = c;
  113.             *cp = '\0';
  114.             prinout(NOFLUSH);
  115.         bufcnt = 0;
  116.             cp = prinbuf;
  117.         }
  118.     }
  119.     close(fd);
  120.     return(1);
  121. }
  122.  
  123.         /*make a file from a message*/
  124.  
  125. makefil()
  126. {
  127.     int fd,fd2,fptr,i,found;
  128.     char hdr[128];
  129.     
  130.     if(user.typ != 'S'){
  131.         sprintf(prinbuf,"Sorry, Sysops Only on this function\n");
  132.         prinout(NOFLUSH);
  133.         return;
  134.     }
  135.  
  136.         if((fd2=openhdrfil()) < 0){
  137.             sprintf(prinbuf,"makefil: Can't open header file\n");
  138.             prinout(NOFLUSH);
  139.             perror("makfil:Opening Header:");
  140.             return;
  141.       }
  142.  
  143.         fptr = 0;
  144.         found = 0;
  145.         while(read(fd2,hdr,89)){
  146.         fptr += 89;
  147.             if(!strncmp(hdr,command.fld[1],strlen(command.fld[1]))){
  148.         found = 1;
  149.             fptr -= 76;
  150.                 lseek(fd2,0L,0);    /* lock file*/
  151.                 locking(fd2,1,0L);
  152.             lseek(fd2,(long)fptr,0);  /*back to 'stat' byte in hdr*/
  153.             write(fd2,"X",1);   /* write 'X' to it*/
  154.                 lseek(fd2,0L,0);    /* unlock file*/
  155.                 locking(fd2,0,0L);
  156.             break;            /* leave loop */
  157.             }
  158.     }
  159.     close(fd2);
  160.  
  161.     if(found == 0){
  162.         sprintf(prinbuf,"Message File not found\n");
  163.         prinout(NOFLUSH);
  164.         return;
  165.     }
  166.     
  167.     sprintf(prinbuf,"mv %s%s %s",maildir,command.fld[1],lowcase(command.fld[2]));
  168.     if(system(prinbuf)){
  169.         sprintf(prinbuf,"File Error");
  170.         prinout(NOFLUSH);
  171.         perror("makfil:System mv:");
  172.         return;
  173.     }
  174.  
  175.  
  176.     msgcnt--;
  177. }
  178.  
  179.